home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 1 / LSD Compendium Deluxe 1.iso / a / programming / assembly / b-block1.lha / DiskLoader.s < prev    next >
Encoding:
Text File  |  1980-01-01  |  3.7 KB  |  235 lines

  1.     org    $28000
  2.     load    $28000
  3. ;Konstanten
  4. Gap_len        =    900
  5. DMA_ReadBytes    =    [($440*11+Gap_len)/2]+2
  6. ;fuer DMA-Transfer
  7. DiskBuf        =    $70000
  8. BlockSize    =    512
  9. Drive        =    0
  10. MAX_HeadMoves    =    2
  11. MAX_ReadTries    =    10
  12.  
  13. WaitBlit:    Macro
  14. \@1
  15.     btst    #6,$2(a6)
  16.     bne.s    \@1
  17.     ENDM
  18. j1:
  19.     lea    DiskDemo1(pc),a0
  20.     move.l    a0,$80.w
  21.     trap    #0
  22.     jmp    $30000
  23. DiskDemo1:
  24.     movem.l    d0-d7/a0-a6,-(a7)
  25.     lea    $30000,a0
  26.     moveq    #80,d0
  27.     moveq    #02,d1
  28.     bsr.b    Trackloader
  29.     movem.l    (a7)+,d0-d7/a0-a6
  30.     rte
  31. ;Trackloader
  32. ;-----------
  33. Trackloader:
  34.     movem.l    d0-d7/a0-a6,-(a7)
  35.     subq.w    #1,d1
  36.     bmi.b    LT_LoadDone
  37.     lea    ReadError(pc),a4
  38.     bsr.b    LT_MoveHead
  39. LT_LoadLoop:
  40.     moveq    #MAX_HeadMoves,d6
  41.     bra.s    LT_NoHead
  42. LT_HeadRetry:
  43.     bsr.b    LT_MoveHead
  44. LT_NoHead:
  45.     moveq    #MAX_ReadTries,d5
  46. LT_ReadRetry:
  47.     bsr.w    LT_ReadTrack
  48.     bsr.w    BlitDecode
  49.     ;bsr.w    CPU_Decode
  50.     move.b    (a4),d7
  51.     beq.s    LT_MoreMore
  52.     dbf    d5,LT_ReadRetry
  53.     dbf    d6,LT_HeadRetry
  54.     move.w    #$4444,d7
  55. LT_WasError:
  56.     move    d7,$dff180
  57.     dbf    d7,LT_WasError
  58. LT_MoreMore:
  59.     lea    $1600(a0),a0
  60.     addq.w    #1,d0
  61.     bchg    #2,(a5)
  62.     btst    #0,d0
  63.     bne.s    LT_Load2
  64.     bclr    #1,(a5)
  65.     bclr    #0,(a5)
  66.     nop
  67.     bset    #0,(a5)
  68.     bsr.b    LT_TIME
  69. LT_Load2:
  70.     dbf    d1,LT_LoadLoop
  71.     bsr.b    LT_Leaver
  72. LT_LoadDone:
  73.     movem.l    (a7)+,d0-d7/a0-a6
  74.     rts
  75. ReadError:    dc.w    0
  76.  
  77. LT_MoveHead:
  78.     lea    $bfd100,a5
  79.     move.b    #$7f,(a5)
  80.     nop
  81.     bclr    #Drive+3,(a5)
  82.     nop
  83. LT_MH0:
  84.     btst    #5,$f01(a5)
  85.     bne.s    LT_MH0
  86. LT_Move2Zero:
  87.     btst    #4,$f01(a5)
  88.     beq.s    LT_HeadAtZero
  89.     bclr    #0,(a5)
  90.     nop
  91.     bset    #0,(a5)
  92.     bsr.b    LT_TIME
  93.     bra.s    LT_Move2Zero
  94. LT_HeadAtZero:
  95.     bset    #2,(a5)
  96.     moveq    #0,d2
  97.     move.b    d0,d2
  98.     lsr.w    #1,d2
  99.     bcc.s    LT_HeadOK
  100.     bclr    #2,(a5)
  101. LT_HeadOK:
  102.     subq.w    #1,d2
  103.     bmi.s    LT_HeadMoved
  104.     bclr    #1,(a5)
  105. LT_MH1:
  106.     bclr    #0,(a5)
  107.     nop
  108.     bset    #0,(a5)
  109.     bsr.b    LT_TIME
  110.     dbf    d2,LT_MH1
  111. LT_HeadMoved:
  112.     rts
  113. LT_Leaver:
  114.     move.b    #$fd,(a5)
  115.     bset    #Drive+3,(a5)
  116.     bset    #0,(a5)
  117.     rts
  118. LT_TIME:
  119.     moveq    #64,d7
  120.     bsr.b    TimeWait
  121.     rts
  122. TimeWait:
  123.     movem.l    d1/d2,-(a7)
  124. TimeWait0:
  125.     move.w    $dff006,d1
  126.     lsr.w    #8,d1
  127. TimeWait1:
  128.     move.w    $dff006,d2
  129.     lsr.w    #8,d2
  130.     cmp.w    d1,d2
  131.     beq.s    TimeWait1
  132.     dbf    d7,TimeWait0
  133.     movem.l    (a7)+,d1/d2
  134.     rts
  135. LT_ReadTrack:
  136.     lea    $dff000,a6
  137.     move.w    #$7f00,$9e(a6)
  138.     move.w    #$8500,$9e(a6)
  139.     move.w    #$4489,$7e(a6)
  140.     move.w    #$8210,$96(a6)
  141. LT_RT0:
  142.     btst    #5,$f01(a5)
  143.     bne.s    LT_RT0
  144.     move.w    #$4000,$24(a6)
  145.     move.l    #DiskBuf,$20(a6)
  146.     move.w    #$8000+DMA_ReadBytes,d2
  147.     move.w    d2,$24(a6)
  148.     move.w    d2,$24(a6)
  149.     move.w    #$2,$9c(a6)
  150. LT_RT1:
  151.     btst    #1,$1f(a6)
  152.     beq.s    LT_RT1
  153.     move.w    #$4000,$24(a6)
  154.     move.w    #$0400,$9e(a6)
  155.     rts
  156. ;---------------------------------------------------------------------------
  157. BlitDecode:
  158.     movem.l    d0-d7/a0-a6,-(a7)
  159.     move.l    #$55555555,d4
  160.     lea    $dff000,a6
  161.     lea    DiskBuf,a1
  162.     moveq    #10,d7
  163. Blit_Dec0:
  164.     cmp.w    #$4489,(a1)+
  165.     bne.s    Blit_Dec0
  166.     cmp.w    #$4489,(a1)
  167.     bne.s    Blit_Dec1
  168.     addq.l    #2,a1
  169. Blit_Dec1:
  170.     bsr.w    Blit_CheckBlock
  171.     ;bsr.w    CPU_CheckBlock
  172.     move.b    d0,(a4)
  173.     bne.s    Blit_Error
  174.     movem.l    (a1),d2/d3
  175.     and.w    d4,d2
  176.     and.w    d4,d3
  177.     add.w    d2,d2
  178.     or.w    d3,d2
  179.     lsr.w    #8,d2
  180.     lsl.w    #8,d2
  181.     add.w    d2,d2
  182.     lea    (a0,d2.w),a2
  183.     lea    56(a1),a1
  184.     bsr.b    Blit_DoBlit
  185.     subq.l    #1,a1
  186.     dbf    d7,Blit_Dec0
  187. Blit_Error:
  188.     movem.l    (a7)+,d0-d7/a0-a6
  189.     rts
  190. Blit_DoBlit:
  191.     WaitBlit
  192.     move.w    #$8640,$96(a6)
  193.     move.l    #$1dd80002,$40(a6)
  194.     move.l    #$ffffffff,$44(a6)
  195.     moveq    #0,d2
  196.     move.l    d2,$62(a6)
  197.     move.w    d2,$66(a6)
  198.     move.w    d4,$70(a6)
  199.     lea    BlockSize-1(a1),a1
  200.     move.l    a1,$50(a6)
  201.     lea    BlockSize(a1),a1
  202.     move.l    a1,$4c(a6)
  203.     lea    BlockSize-1(a2),a2
  204.     move.l    a2,$54(a6)
  205.     move.w    #$0808,$58(a6)
  206.     rts
  207. Blit_CheckBlock:
  208.     movem.l    d2/d3/a2/a3,-(a7)
  209.     movem.l    48(a1),d2/d3
  210.     and.l    d4,d2
  211.     add.l    d2,d2
  212.     and.l    d4,d3
  213.     or.l    d3,d2
  214.     lea    56(a1),a2
  215.     lea    48(a1),a3
  216.     moveq    #0,d0
  217.     move.l    d0,(a3)
  218.     waitblit
  219.     move.w    #$8640,$96(a6)
  220.     move.l    a3,$4c(a6)
  221.     move.l    a2,$50(a6)
  222.     move.l    a3,$54(a6)
  223.     move.l    #$0d3c0000,$40(a6)
  224.     move.l    #$FFFFFFFF,$44(a6)
  225.     move.w    #$FFFc,$62(a6)
  226.     move.l    #$0000FFFC,$64(a6)
  227.     move.w    #$4002,$58(a6)
  228.     waitblit
  229.     move.l    (a3),d0
  230.     and.l    d4,d0
  231.     sub.l    d2,d0
  232.     sne    d0
  233.     movem.l    (a7)+,d2/d3/a2/a3
  234.     rts
  235.